package com.fzy.designpattern.prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Prototype {


    /**
     * 浅复制,只能复制类，但类的属性还是指向同一个地址
     */
    public void lightCopy() {

        User user = new User("liuxg", 18);
        User uclone = (User) user.clone();
        //user.setName("liuxg2"); //重新把user的name设置为liuxg2.发现uclone下的name也变成了liuxg2，所有user和uclone指向的同一个地址
        System.out.println(uclone.getName() + " : " + uclone.getAge());
    }


    /**
     * 深复制，除了复制类，还复杂属性，使用的时候java的序列化和反序列化
     */
    public void deepCopy() {

        try {
            User user = new User("liuxg", 18);

            //序列化
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(user);

            //反序列化
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            User uclone = (User) ois.readObject();

            //user.setName("liuxg2"); //user的name变成liuxg2，uclone的name还是liuxg，说明属性也进行不了复制，没有指向同一个地址
            System.out.println(uclone.getName() + " : " + uclone.getAge());

            oos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
